package br.edu.ufcg.p1.barzin.util;

import static br.edu.ufcg.p1.barzin.util.PrefManConstants.BAR_NAME;
import static br.edu.ufcg.p1.barzin.util.PrefManConstants.TABLET_ID;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

import org.json.JSONException;
import org.json.JSONObject;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import br.edu.ufcg.p1.barzin.model.ApagarMensagens;
import br.edu.ufcg.p1.barzin.model.Cardapio;
import br.edu.ufcg.p1.barzin.model.Categoria;
import br.edu.ufcg.p1.barzin.model.Item;
import br.edu.ufcg.p1.barzin.model.ListaMensagens;
import br.edu.ufcg.p1.barzin.model.Mensagem;
import br.edu.ufcg.p1.barzin.model.MensagensNovas;
import br.edu.ufcg.p1.barzin.model.Mesa;
import br.edu.ufcg.p1.barzin.model.MesasDisponiveis;
import br.edu.ufcg.p1.barzin.model.Pedido;
import br.edu.ufcg.p1.barzin.model.Propaganda;
import br.edu.ufcg.p1.barzin.model.TotalMensagensNovas;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonParseException;

public class HTTPCalls {

	public static Map<String, String> realizaLogin(String login, String senha,
			String nomeTablet) {
		Map<String, String> map = new HashMap<String, String>();
		try {
			String url = HTTPConstants.REGISTER_URL;
			url += "?usuario=" + login;
			url += "&senha=" + senha;
			url += "&nome_tablet=" + nomeTablet;

			InputStream inpStr = HTTPUtils.getStreamFor(url);

			String response = new Scanner(inpStr).useDelimiter("\\A").next();

			try {
				JSONObject json = new JSONObject(response);
				map.put(BAR_NAME, json.getString("nome_bar"));
				map.put(TABLET_ID, json.getInt("id_tablet") + "");
			} catch (JSONException e) {
				map.put("ERRO", response);
			}
		} catch (Exception e) {
		}
		return map;
	}

	public static String associarTablet(Integer id) {
		try {

			String url = HTTPConstants.ASSOCIAR_TABLET;
			url += "?id_tablet=" + id;

			InputStream inpStr = HTTPUtils.getStreamFor(url);
			String response = new Scanner(inpStr).useDelimiter("\\A").next();

			try {
				JSONObject json = new JSONObject(response);

				if (json.has("erro")) {
					return json.getString("erro");
				} else {
					return json.getString("nome");
				}

			} catch (JSONException e) {
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return null;
	}

	public static Map<String, Object> checaMesasDisponiveis(String login,
			String senha) {
		Map<String, Object> map = new TreeMap<String, Object>();
		try {

			String url = HTTPConstants.MESAS_DISPONIVEIS;
			url += "?user=" + login;
			url += "&senha=" + senha;

			InputStream inpStr = HTTPUtils.getStreamFor(url);

			GsonBuilder builder = new GsonBuilder();
			Gson gson = builder.create();
			Reader reader = new InputStreamReader(inpStr);

			try {
				MesasDisponiveis mesas = gson.fromJson(reader,
						MesasDisponiveis.class);

				for (Mesa mesa : mesas.getLista()) {
					map.put(mesa.getNome(), mesa.getId());
				}

			} catch (JsonParseException e) {
				map.put("ERRO", gson.fromJson(reader, String.class));
			} catch (Exception e) {
				e.printStackTrace();
			}

		} catch (Exception e) {
			// TODO: handle exception
		}

		return map;
	}

	public static ApagarMensagens precisaApagarMensagem(Integer id) {
		ApagarMensagens apagarMsgs = null;

		try {
			String url = HTTPConstants.APAGAR_MENSAGENS;
			url += "?id_tablet=" + id;

			InputStream inpStr = HTTPUtils.getStreamFor(url);

			Log.d("No precisaApagar", url);

			GsonBuilder builder = new GsonBuilder();
			Gson gson = builder.create();
			Reader reader = new InputStreamReader(inpStr);
			// Gson gson = new Gson();
			//
			// Reader reader = new InputStreamReader(inpStr);

			try {
				apagarMsgs = gson.fromJson(reader, ApagarMensagens.class);
			} catch (JsonParseException e) {
				e.printStackTrace();
			}

			Log.d("No precisaApagar", apagarMsgs.toString());
		} catch (Exception e) {
			// TODO: handle exception
		}
		return apagarMsgs;
	}

	public static boolean checaContaAberta(Integer id) {
		try {
			String url = HTTPConstants.CONTA_ABERTA;
			url += "?id_tablet=" + id;

			InputStream inpStr = HTTPUtils.getStreamFor(url);
			String response = new Scanner(inpStr).useDelimiter("\\A").next();
			return !response.equals("0");
		} catch (Exception e) {
			// TODO: handle exception

		}
		return false;
	}

	public static TotalMensagensNovas recuperaTotalNovasMensagens(Integer id) {
		TotalMensagensNovas mesas = null;

		try {
			String url = HTTPConstants.TOTAL_NOVAS_MSGS;
			url += "?id_tablet=" + id;

			// InputStream inpStr = HTTPUtils.getStreamFor(url);
			// String response = new Scanner(inpStr).useDelimiter("\\A").next();
			//
			// try {
			// return Integer.parseInt(response);
			// } catch (Exception e) {
			// }

			InputStream inpStr = HTTPUtils.getStreamFor(url);

			GsonBuilder builder = new GsonBuilder();
			Gson gson = builder.create();
			Reader reader = new InputStreamReader(inpStr);

			try {
				mesas = gson.fromJson(reader, TotalMensagensNovas.class);
			} catch (Exception e) {
				e.printStackTrace();
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return mesas;
	}

	public static MensagensNovas recuperaMsgsNovas(Integer id) {
		MensagensNovas mesas = null;

		try {
			String url = HTTPConstants.MSGS_POR_REMETENTE;
			url += "?id_tablet=" + id;

			InputStream inpStr = HTTPUtils.getStreamFor(url);

			GsonBuilder builder = new GsonBuilder();
			Gson gson = builder.create();
			Reader reader = new InputStreamReader(inpStr);

			try {
				mesas = gson.fromJson(reader, MensagensNovas.class);
			} catch (Exception e) {
				e.printStackTrace();
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return mesas;
	}

	public static ListaMensagens recuperaNovasMsgs(Integer idRemetente,
			Integer idDestinatario) {
		ListaMensagens mesas = null;

		try {

			String url = HTTPConstants.RECUPERAR_MSG;
			url += "?id_tablet=" + idDestinatario;
			url += "&id_remetente=" + idRemetente;

			InputStream inpStr = HTTPUtils.getStreamFor(url);

			Gson gson = new Gson();

			Reader reader = new InputStreamReader(inpStr);

			try {
				mesas = gson.fromJson(reader, ListaMensagens.class);
			} catch (Exception e) {
				e.printStackTrace();
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return mesas;
	}

	public static Pedido realizaPedido(Pedido pedido, Integer tabletId) {
		Pedido pedidoDoServidor = null;
		try {

			String url = HTTPConstants.NOVO_PEDIDO_URL;
			url += "?item_id=" + pedido.getItem().getId();
			url += "&quantidade=" + pedido.getQuantidade();
			url += "&tablet_id=" + tabletId;

			InputStream inpStr = HTTPUtils.getStreamFor(url);

			Gson gson = new Gson();

			Reader reader = new InputStreamReader(inpStr);

			try {
				pedidoDoServidor = gson.fromJson(reader, Pedido.class);
			} catch (JsonParseException e) {
				e.printStackTrace();
			}

		} catch (Exception e) {
			// TODO: handle exception
		}
		return pedidoDoServidor;
	}

	public static Pedido alteraPedido(Pedido pedido) {
		Pedido pedidoDoServidor = null;

		try {

			String url = HTTPConstants.ALTERA_PEDIDO_URL;
			url += "?pedido_id=" + pedido.getId();
			url += "&quantidade=" + pedido.getQuantidade();
			url += "&estado=" + pedido.getEstado();

			InputStream inpStr = HTTPUtils.getStreamFor(url);

			Gson gson = new Gson();

			Reader reader = new InputStreamReader(inpStr);

			try {
				pedidoDoServidor = gson.fromJson(reader, Pedido.class);
			} catch (JsonParseException e) {
				e.printStackTrace();
			}

		} catch (Exception e) {
			// TODO: handle exception
		}
		return pedidoDoServidor;
	}

	public static Cardapio recuperaCardapio(long idTablet, long versao) {
		Cardapio cardapio = null;

		try {

			String url = HTTPConstants.RECUPERA_CARDAPIO_URL;
			url += "?id_tablet=" + idTablet;
			url += "&versao_cardapio=" + versao;

			InputStream inpStr = HTTPUtils.getStreamFor(url);

			Gson gson = new Gson();

			Reader reader = new InputStreamReader(inpStr);

			try {
				cardapio = gson.fromJson(reader, Cardapio.class);

				List<Item> i = new ArrayList<Item>();
				for (Categoria categoria : cardapio.getCategorias()) {
					i.addAll(categoria.getTodosItens());
				}

				for (Item item : i) {
					item.setThumb(recuperaThumb(item.getId()));
					item.setFoto(recuperaFoto(item.getId()));
				}
			} catch (JsonParseException e) {
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return cardapio;
	}

	private static Bitmap recuperaThumb(int id) {
		try {
			String url = HTTPConstants.RECUPERA_THUMB;
			url += "?id_item=" + id;
			return BitmapFactory.decodeStream(HTTPUtils.getStreamFor(url));
		} catch (Exception e) {
			// TODO: handle exception
		}
		return null;
	}

	private static Bitmap recuperaFoto(int id) {
		try {
			String url = HTTPConstants.RECUPERA_FOTO;
			url += "?id_item=" + id;
			Log.d("Baixando a foto:",url);
			return BitmapFactory.decodeStream(HTTPUtils.getStreamFor(url));
		} catch (Exception e) {
			// TODO: handle exception
		}
		return null;
	}

	public static String desvincular(String login, String senha, Integer id) {
		try {
			String url = HTTPConstants.DESASSOCIAR_TABLET;
			url += "?id_tablet=" + id;
			url += "&user=" + login;
			url += "&senha=" + senha;

			InputStream inpStr = HTTPUtils.getStreamFor(url);
			String response = new Scanner(inpStr).useDelimiter("\\A").next();
			return response;
		} catch (Exception e) {
			// TODO: handle exception
		}
		return "erro";
	}

	public static Mensagem enviaMsg(Mensagem mensagem) {
		Mensagem msgDoServidor = null;

		try {
			String url = HTTPConstants.ENVIAR_MSG;
			url += "?id_remetente=" + mensagem.getIdRemetente();
			url += "&id_destinatario=" + mensagem.getIdDestinatario();
			url += "&mensagem=" + URLEncoder.encode(mensagem.getMensagem());

			InputStream inpStr = HTTPUtils.getStreamFor(url);

			Gson gson = new Gson();

			Reader reader = new InputStreamReader(inpStr);

			try {
				msgDoServidor = gson.fromJson(reader, Mensagem.class);
			} catch (JsonParseException e) {
				e.printStackTrace();
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return msgDoServidor;
	}
	
	private static Bitmap recuperaFoto(String url) {
		try {
			return BitmapFactory.decodeStream(HTTPUtils.getStreamFor(url));
		} catch (Exception e) {
			// TODO: handle exception
		}
		return null;
	}
	
	public static List<Propaganda> recuperaPropagandas() {
		List<Propaganda> propagandas = new ArrayList<Propaganda>();
		
		try {
			String url = HTTPConstants.RECUPERAR_PROPAGANDAS;
			
			InputStream inpStr = HTTPUtils.getStreamFor(url);
			
			Gson gson = new Gson();

			Reader reader = new InputStreamReader(inpStr);
			
			
			
			try {
				String[] urls = gson.fromJson(reader, String[].class);
				for(String s : urls) {
					
					Log.d("TAG", s);
					
					if (s.endsWith("jpg")) {
						Propaganda p = new Propaganda();
						p.setFoto(recuperaFoto(s));
						propagandas.add(p);
					}
					
				}
			} catch (JsonParseException e) {
				e.printStackTrace();
			}
			
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		Log.d(">>", propagandas.toString());
		
		return propagandas;
	}

}
